// 回调函数

// 案例1：先打印输出1，然后再打印输出2。

// {
//     function one() {
//         console.log(1);
//     }
//     function two() {
//         console.log(2);
//     }

//     one();
//     two();
//     // 1 2
// }

// {
//     function one() {
//         // 异步
//         setTimeout(() => {
//             console.log(1);
//         }, 0)
//     }
//     function two() {
//         console.log(2);
//     }

//     one();
//     two();
//     // 2 1
// }


// 回调函数：two函数是回调函数，这个two函数将会在one函数完成执行之后立即执行。
/*
{
    function one(callback) {
        // 同步
        console.log("one函数开始执行");
        // 异步
        setTimeout(() => { 
            console.log(1);
            callback && callback();
            // if(callback) {
            //     callback()
            // }
        }, 0)
        // 同步
        console.log("one函数结束执行");
    } 
    function two() {
        console.log(2);
    }

    one(two); // 1 2
    // one()
}
*/

// 简化
{
    function one(callback) {
        setTimeout(() => {
            console.log(1);
            callback && callback();
        }, 0)
    }
    // function two() {
    //     console.log(2);
    // }

    one(() => {
        console.log(2);
    }); // 1 2
}

// 案例2：简单加法运算，但是有一个条件，传入参数和返回计算结果是异步的。

// function sum(x, y) {
//     return x + y;
// }

// console.log(sum(1, 2));

// function sum(x, y) {
//     console.log("开始计算");
//     // 设置1s后返回计算结果
//     setTimeout(() => {
//         // 返回计算结果
//         return x + y;
//     }, 1000);
//     console.log("结束计算");
// }

// // 打印函数调用返回结果
// console.log("sum(1, 2)的计算结果" + sum(1, 2)); // undefined

// 为什么会是这个结果？是因为程序没有等待到setTimeout里面相加这步运行结束就已经打印输出结果了。所以返回结果是undefined。

// 使用回调函数来解决这个问题

// function sum(x, y, callback) {
//     console.log("开始计算");
//     // 设置1s后返回计算结果
//     setTimeout(() => {
//         // 返回计算结果
//         let result = x + y;
//         callback && callback(result);
//     }, 1000);
//     console.log("结束计算");
// }

// 打印函数调用返回结果
// sum(1, 2, res => {
//     console.log("sum(1, 2)的计算结果" + res);
// }); // 3



